﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace WFExtended.Twitter
{
    /// <summary>
    /// Tweet Status
    /// </summary>
    [DataContract]
    public class Status
    {
        /// <summary>
        /// Gets or sets the metadata.
        /// </summary>
        /// <value>
        /// The metadata.
        /// </value>
        [DataMember(Name = "metadata")]
        public Metadata Metadata { get; set; }

        /// <summary>
        /// Gets or sets the created at.
        /// </summary>
        /// <value>
        /// The created at.
        /// </value>
        [DataMember(Name = "created_at")]
        public string CreatedAt { get; set; }

        /// <summary>
        /// Gets or sets the ID.
        /// </summary>
        /// <value>
        /// The ID.
        /// </value>
        [DataMember(Name = "id")]
        public long ID { get; set; }

        /// <summary>
        /// Gets or sets the ID string.
        /// </summary>
        /// <value>
        /// The ID string.
        /// </value>
        [DataMember(Name = "id_str")]
        public string IDString { get; set; }

        /// <summary>
        /// Gets or sets the text.
        /// </summary>
        /// <value>
        /// The text.
        /// </value>
        [DataMember(Name = "text")]
        public string Text { get; set; }

        /// <summary>
        /// Gets or sets the source.
        /// </summary>
        /// <value>
        /// The source.
        /// </value>
        [DataMember(Name = "source")]
        public string Source { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="Status"/> is truncated.
        /// </summary>
        /// <value>
        ///   <c>true</c> if truncated; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "truncated")]
        public bool Truncated { get; set; }

        /// <summary>
        /// Gets or sets the in reply to status id.
        /// </summary>
        /// <value>
        /// The in reply to status id.
        /// </value>
        [DataMember(Name = "in_reply_to_status_id")]
        public long? InReplyToStatusId { get; set; }

        /// <summary>
        /// Gets or sets the in reply to status id string.
        /// </summary>
        /// <value>
        /// The in reply to status id string.
        /// </value>
        [DataMember(Name = "in_reply_to_status_id_str")]
        public string InReplyToStatusIdString { get; set; }

        /// <summary>
        /// Gets or sets the in reply to user id.
        /// </summary>
        /// <value>
        /// The in reply to user id.
        /// </value>
        [DataMember(Name = "in_reply_to_user_id")]
        public long? InReplyToUserId { get; set; }

        /// <summary>
        /// Gets or sets the in reply to user id string.
        /// </summary>
        /// <value>
        /// The in reply to user id string.
        /// </value>
        [DataMember(Name = "in_reply_to_user_id_str")]
        public string InReplyToUserIdString { get; set; }

        /// <summary>
        /// Gets or sets the name of the in reply to screen.
        /// </summary>
        /// <value>
        /// The name of the in reply to screen.
        /// </value>
        [DataMember(Name = "in_reply_to_screen_name")]
        public string InReplyToScreenName { get; set; }

        /// <summary>
        /// Gets or sets the user.
        /// </summary>
        /// <value>
        /// The user.
        /// </value>
        [DataMember(Name = "user")]
        public User User { get; set; }

        /// <summary>
        /// Gets or sets the coordinates.
        /// </summary>
        /// <value>
        /// The coordinates.
        /// </value>
        [DataMember(Name = "coordinates")]
        public Coordinates Coordinates { get; set; }

        /// <summary>
        /// Gets or sets the place.
        /// </summary>
        /// <value>
        /// The place.
        /// </value>
        [DataMember(Name = "place")]
        public Place Place { get; set; }

        /// <summary>
        /// Gets or sets the contributors.
        /// </summary>
        /// <value>
        /// The contributors.
        /// </value>
        [DataMember(Name = "contributors")]
        public List<Contributor> Contributors { get; set; }

        /// <summary>
        /// Gets or sets the retweeted status.
        /// </summary>
        /// <value>
        /// The retweeted status.
        /// </value>
        [DataMember(Name = "retweeted_status")]
        public Status RetweetedStatus { get; set; }

        /// <summary>
        /// Gets or sets the retweet count.
        /// </summary>
        /// <value>
        /// The retweet count.
        /// </value>
        [DataMember(Name = "retweet_count")]
        public int RetweetCount { get; set; }

        /// <summary>
        /// Gets or sets the favorite count.
        /// </summary>
        /// <value>
        /// The favorite count.
        /// </value>
        [DataMember(Name = "favorite_count")]
        public int FavoriteCount { get; set; }

        /// <summary>
        /// Gets or sets the entities.
        /// </summary>
        /// <value>
        /// The entities.
        /// </value>
        [DataMember(Name = "entities")]
        public Entities Entities { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="Status"/> is favorited.
        /// </summary>
        /// <value>
        ///   <c>true</c> if favorited; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "favorited")]
        public bool Favorited { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="Status"/> is retweeted.
        /// </summary>
        /// <value>
        ///   <c>true</c> if retweeted; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "retweeted")]
        public bool Retweeted { get; set; }

        /// <summary>
        /// Gets or sets the lang.
        /// </summary>
        /// <value>
        /// The lang.
        /// </value>
        [DataMember(Name = "lang")]
        public string Lang { get; set; }
    }
}
